package org.xmppbot.net.nio;

import java.net.InetSocketAddress;

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmppbot.net.Accessor;
import org.xmppbot.net.ConnectionStrategy;

/**
 * Класс отвечат за входящие соединения.
 * 
 * @author stas
 */
class BotSocketAcceptor implements ConnectionStrategy {
	
	private static final int PORT = 5269;
	
	private static BotSocketAcceptor _instance = null;
	private IoAcceptor _acceptor = null;

    static {
        Accessor.setInstance(new AccessorImpl());
    }

	private BotSocketAcceptor() {
	}
	
	static BotSocketAcceptor getInstance() {
		if (_instance == null) _instance = new BotSocketAcceptor();
		return _instance;
	}
	
	public void start(){
		try{
			_acceptor = new NioSocketAcceptor();
			
			_acceptor.getFilterChain().addFirst("codec", new ProtocolCodecFilter( new ProtocolCodecFactoryImpl()));

			_acceptor.setHandler(  new BotSocketIOHandler() );

//	        _acceptor.getSessionConfig().setReadBufferSize( 2048 );
	        _acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
			
	        _acceptor.bind( new InetSocketAddress(PORT) );

	        _logger.debug("BotSocketAcceptor v 1.0.0 b0001 запущен на порту "+PORT);
		}catch (Exception e){
			_logger.error("Во время запуска BotSocketAcceptor произошла ошибка!", e);
		}
	}
	
	
	public void stop(){
		try{
			if (_acceptor != null){ 
				_acceptor.unbind();
				_logger.debug("BotSocketAcceptor остановлен.");
			}
		}catch (Exception e){
			_logger.error("Во время остановки BotSocketAcceptor произошла ошибка!", e);
		}
	}
	
	
	private static final Logger _logger = LoggerFactory.getLogger(BotSocketAcceptor.class);
}
